package com.atguigu.java;

import org.junit.Test;

import java.io.*;
import java.time.Duration;
import java.time.LocalDateTime;

/**
 *     测试FileInputStream和FileOutputStream的使用
 *
 *     一个英文字符，在UTF-8字符集和GBK字符集中占据一个字节
 *     一个中文，在UTF-8字符集里占据3个字节，在GBK字符集里占据2个字节
 *
 *
 *     结论：
 *          1.对于文本文件(.txt,.java,.c,.cpp)，使用字符流处理
 *          2.对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt,....)，使用字节流处理
 *          3.如果只是复制文本文件，而不在控制台(内存)看内容，字节流是可以读取文本文件的
 *
 *
 * @author : leimingchao
 * @date Date : 2021年10月10日 8:03
 */
public class FileInputOutputStreamTest {

    /**
     * 使用字节流FileInputStream处理文本文件，可能出现乱码。
     */
    @Test
    public void testFileInputStream() {
        FileInputStream fis = null;

        try {
            //1.造文件
            File file = new File("hello.txt");
            //2.造流
            fis = new FileInputStream(file);
            //3.读数据
            byte[] arr = new byte[5];
            //记录每次读取的字节的个数
            int len;
            while ((len = fis.read(arr)) != -1) {
                String str = new String(arr,0,len);
                System.out.print(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.关闭资源

            try {
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 实现对图片的复制
     */
    @Test
    public void testFileInputOutputStream() {

        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            File srcFile = new File("爱情与友情.jpg");
            File destFile = new File("爱情与友情2.jpg");
            fileInputStream = new FileInputStream(srcFile);
            fileOutputStream = new FileOutputStream(destFile);

            //复制过程
            byte[] arr = new byte[5];
            int len;
            while ((len = fileInputStream.read(arr)) != -1) {
                fileOutputStream.write(arr,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            if (fileOutputStream != null) {

                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileInputStream != null) {

                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 指定路径下文件的复制
     */
    public void copyFile(String srcPath,String destPath) {
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            File srcFile = new File(srcPath);
            File destFile = new File(destPath);
            fileInputStream = new FileInputStream(srcFile);
            fileOutputStream = new FileOutputStream(destFile);

            //复制过程
            byte[] arr = new byte[5];
            int len;
            while ((len = fileInputStream.read(arr)) != -1) {
                fileOutputStream.write(arr,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            if (fileOutputStream != null) {

                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileInputStream != null) {

                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Test
    public void testCopyFile() {

        LocalDateTime startDateTime = LocalDateTime.now();
        String srcPath = "爱情与友情.jpg";
        String destPath = "爱情与友情3.jpg";

        // String srcPath = "hello.txt";
        // String destPath = "hello3.txt";
        copyFile(srcPath,destPath);
        LocalDateTime endDateTime = LocalDateTime.now();

        long seconds = Duration.between(startDateTime, endDateTime).getSeconds();
        System.out.println("复制操作花费的时间：" + seconds * 1000);
    }
}
